<?php

class PagSeguroComponent extends Component{
	
	var $components = array('Session');
	
	var $numero_produtos = 0;
	private $fields = "";
	
	public function gravaInformacoes($dados){
		$this->Session->write('Pagamento.valor_base', $dados['preco']);
		$soma = 0;
		$array = array();
		if(isset($dados['Cursos'])){
			foreach($dados['Cursos'] as $item){
				$array[] = array(
						'id' => $item['Curso']['id'],
						'descricao'=>'Curso: '.$item['Curso']['nome'],
						'valor'=>$item['Curso']['preco']
				);
				$soma += $item['Curso']['preco'];
			}
			$this->Session->write('Pagamento.Cursos', $array);
		}
		$this->Session->write('Pagamento.valor_cursos', $soma);
		$soma = 0;
		$array = array();
		if(isset($dados['Materiais'])){
			foreach($dados['Materiais'] as $item){
				$array[] = array(
						'id' => $item['Curso']['id'],
						'descricao'=>'Material: '.$item['Curso']['nome'],
						'valor'=>$item['Curso']['preco_material']
				);
				$soma += $item['Curso']['preco_material'];
			}
			$this->Session->write('Pagamento.Materiais', $array);
		}
		$this->Session->write('Pagamento.valor_materiais', $soma);
	}
	
	public function adicionaProduto($cod, $desc, $valor, $qtde = 1){
		$array = array();
		$this->numero_produtos++;
		$array['itemId'.$this->numero_produtos]=$cod;
		$array['itemDescription'.$this->numero_produtos]=$desc;
		$array['itemQuantity'.$this->numero_produtos]=$qtde;
		$array['itemAmount'.$this->numero_produtos]=$valor;
		$array['itemWeight'.$this->numero_produtos]=0;
		return $array;
	}
	
	public function dadosPost($id_user, $codigo_retorno){
		$info_basicas = array("email"=>$this->Session->read('config.email_pagamento'),
				"token"=>$this->Session->read('config.token_pagamento'),
				"currency"=>'BRL',
				"tipo"=>'CP',
				"redirectURL"=>Router::url('/pagamentos/retornoPagSeguro/'.$codigo_retorno, true),
				"notificationURL"=>'http://scige.gwd-web.com.br/pagamentos/pagseguro_response',
				//"redirectURL"=>Router::url(array('controller'=>'pagamentos', 'action'=>'confirmar_inscricao'), true),
				//"notificationURL"=>Router::url(array('controller'=>'pagamentos', 'action'=>'pagseguro_response'), true),
				"maxUses"=>1,
				"maxAge"=>30,
				"charset"=>'UTF-8',
				"reference"=>$this->Session->read('config.pagseguro_evento_code').$id_user
		);
		$produtos = $info_basicas;
		$produtos = array_merge($produtos, $this->infoDeUsuario());
		$valor_base = $this->adicionaProduto(0, __('Preço-Base Inscrição'), $this->Session->read('Pagamento.valor_base'));
		$produtos = array_merge($produtos, $valor_base);
		if($this->Session->check('Pagamento.Cursos')){
			foreach($this->Session->read('Pagamento.Cursos') as $item){
				$produtos = array_merge($produtos, $this->adicionaProduto($item['id'], $item['descricao'], $item['valor']));
			}
			foreach($this->Session->read('Pagamento.Materiais') as $item){
				$produtos = array_merge($produtos, $this->adicionaProduto($item['id'], $item['descricao'], $item['valor']));
			}
		}
		return ($produtos);
	}
	
	public function setup($codigo_retorno){
		// TODO Tratar quando tiver erro e não deixar salvar a inscrição
		$email = $this->Session->read('config.email_pagamento');
		$token = $this->Session->read('config.token_pagamento');
		$this->numero_produtos = 0;
		ob_start();
		$ch = curl_init();
		$dados = $this->dadosPost($this->Session->read('Auth.User.id'), $codigo_retorno);
		curl_setopt($ch, CURLOPT_URL, URL_CHECKOUT_PAGSEGURO);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_POST, true); // POST
		curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
		curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($dados));
		curl_setopt($ch, CURLOPT_ENCODING, 'UTF-8');
		curl_getinfo($ch);
		$xml = (curl_exec($ch));
		$xml = $this->geraCodigoXml($xml);
		//sleep(35);
		return $xml;
	}
	
	
	private function fields($campo, $valor){
//		$this->fields[$campo]=iconv("UTF-8", "ISO-8859-1", $valor);
		$this->fields[$campo]=$valor;
	}
	
	private function infoDeUsuario(){
		// TODO DONE Colocar o telefone aqui
		$this->Usuario = ClassRegistry::init('Usuario');
		$array = array();
		$usuario = $this->Usuario->findById($this->Session->read('Auth.User.Usuario.id'));
		$array["senderName"]= $usuario['Usuario']['nome'];
		$array["shippingType"]= 1;
		$array["shippingAddressPostalCode"]= $usuario['Endereco']['cep'];
		$array["shippingAddressStreet"]= $usuario['Endereco']['logradouro'];
		$array["shippingAddressNumber"]= $usuario['Endereco']['numero'];
		$array["shippingAddressComplement"]= $usuario['Endereco']['complemento'];
		$array["shippingAddressDistrict"]= $usuario['Endereco']['bairro'];
		$array["shippingAddressCity"]= $usuario['Endereco']['cidade'];
	//	$array["shippingAddressState"]= $usuario['Endereco']['estado'];
		$array["shippingAddressCountry"]= "BRA";
		if(isset($usuario['Telefone'][0]['area']))
			$array["senderAreaCode"]= $usuario['Telefone'][0]['area'];
		if(isset($usuario['Telefone'][0]['numero']))
			$array["senderPhone"]= $usuario['Telefone'][0]['numero'];
		$array["senderEmail"]= $usuario['Usuario']['email'];
		return $array;
	}
	
	private function dadosCompra($dados){
		$this->fields('email', EMAIL_DEFAULT);
		$this->fields('token', TOKEN_PAG_SEGURO);
		$this->fields('currency', "BRL");
		$this->fields('tipo', "CP");
		$this->fields('itemId1', "0001");
		$this->fields('itemDescription1', $dados['descricao']);
		$this->fields('itemQuantity1', "1");
		$this->fields('itemAmount1', $dados['valor']);
		$this->fields('itemWeight1', "0");
	}
	
	private function geraCodigoXml($xml){
		$xml = $this->xml_parser($xml);
		if(isset($xml->code))
			return $xml->code;
		else $this->Session->setFlash('Erro no PagSeguro => '.$xml->error->message, 'flash/bootstrap', array('class'=>'alert alert-error'));
		return false;
	}
	
	private function xml_parser($xml){
		$xml = simplexml_load_string($xml);
		return $xml;
	}
	
	public function efetuarPagamento($anuncio, $usuario, $dados_compra){
		$this->dadosUsuario($usuario);
		$this->dadosCompra($dados_compra);
		$this->fields =  http_build_query($this->fields);
	
		$xml = $this->sendCurl();
		return $this->geraCodigoXml($xml);
	}
	
	public function getNotificacaoAndSave($notification){
		$url_notificacao = URL_GET_NOTIFICACAO_PAGSEGURO;
		$url_notificacao .= '/'.$notification;
		$url_notificacao .= '?email='.$this->Session->read('config.email_pagamento').'&token='.$this->Session->read('config.token_pagamento');
		pr($url_notificacao);
		$c = curl_init($url_notificacao);
		curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
		//	curl_setopt($c, CURLOPT_POST, true); // POST
		curl_setopt($c, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
		//	curl_setopt($c, CURLOPT_POSTFIELDS, $this->fields);
		curl_setopt($c, CURLOPT_ENCODING, 'UTF-8');
		curl_getinfo($c);
		$xml = curl_exec ($c);
		curl_close ($c);
		$xml = $this->xml_parser($xml);
		return $this->salvaTransacao($xml, $notification);
	}
	
	
	private function salvaTransacao($dados, $notification){
		$array_to_save = array(
			'code'=>$dados->code,
			'notification_code'=>$notification,
			'pagseguro_status_id'=>$dados->status,
			'pagseguro_formas_pagamento_id'=>$dados->paymentMethod->type,
			'pagseguro_metodos_pagamento_id'=>$dados->paymentMethod->code,
			'pagseguro_payment_link'=>$dados->paymentLink,
			'date'=>$dados->lastEventDate,
			'pagamento_id'=>substr($dados->reference, strlen($this->Session->read('config.pagseguro_evento_code'))),
			'data_transacao'=>$dados->date
		);
		$this->Transacao = ClassRegistry::init('PagseguroTransacao');
		return $this->Transacao->save($array_to_save);
	}
	
	public function getTransactionCodeAndInscricaoId($id){
		$this->Transacao = ClassRegistry::init('PagseguroTransacao');
		$dados = $this->Transacao->findById($id);
		return array('code'=>$dados['PagseguroTransacao']['code'], 'inscricao'=>$dados['PagseguroTransacao']['pagamento_id']);
	}
}
